Loading...
 

Uogólnienie funkcji bazowych poprzez iloczyn tensorowy na 3D

Pokażemy teraz w jaki sposób definicje funkcji bazowych można uogólnić na problemy trójwymiarowe.
Rozważmy najpierw siatkę prostopadłościenną, na której rozpinamy \( N_x \times N_y \times N_z=16 \times 16 \times 16 \) elementów, której jeden brzeg jest równoległy do osi \( x \), drugi brzeg jest równoległy do osi \( y \), a trzeci brzeg jest równoległy do osi \( z \). Mamy więc \( N_x=16 \) elementów wzdłuż osi \( x \) i \( N_y=16 \) elementów wzdłuż osi \( y \) oraz \( N_z=16 \) elementów wzdłuż osi \( z \).
Rozważmy ponownie problem aproksymacji bitmapy opisany szczegółowo w rozdziale pierwszym. Tym razem jednak musimy skupić się na trójwymiarowej bitmapie. Bitmapy takie są generowane na przykład podczas tomografii komputerowych głowy .

Plasterki trójwymiarowej bitmapy uzyskanej w wyniku tomografii komputerowej głowy.
Rysunek 1: Plasterki trójwymiarowej bitmapy uzyskanej w wyniku tomografii komputerowej głowy.

Definiujemy następnie wektor węzłów wzdłuż osi \( x \)
[0 0 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 16 16 16]
oraz identyczny wektor węzłów wzdłuż osi \( y \)
[0 0 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 16 16 16]
i wzdłuż osi \( z \)
[0 0 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 16 16 16].
Wektory te definiują funkcje bazowe B-spline trzeciego stopnia o ciągłości dwa.
Nasze wektory węzłów definiują następujące funkcje bazowe
\( B^x_{1;3}(x),...,B^x_{19;3}(x)\textrm{ wzdłuż osi }x \),
\( B^y_{1;3}(y),...,B^y_{19;3}(y)\textrm{ wzdłuż osi }y \), oraz
\( B^z_{1;3}(z),...,B^z_{19;3}(z)\textrm{ wzdłuż osi }z \),
Wzory tych jednowymiarowych funkcji B-spline mogą zostać wyprowadzone zgodnie z formułą Cox-de Boor'a.
Jest ich 19 w każdym kierunku, ponieważ \( N_x+p=N_y+p=N_z+p=16+3=19 \).
Następnie nasze trójwymiarowe funkcje bazowe uzyskujemy przemnażając przez siebie wybraną jedną funkcję bazową z pierwszego zbioru, rozpiętego wzdłuż osi \( x \), jedną funkcję bazową z drugiego zbioru, rozpiętego wzdłuż osi \( y \), oraz jedną funkcję bazową z drugiego zbioru, rozpiętego wzdłuż osi \( z \). Możemy je uporządkować poziomami (równolegle do płaszczyzny \( OXY \)) i wierszami (równoległymi do osi \( x \)).
\( B^x_{1;3}B^y_{1,3}B^z_{1,3}, B^x_{2;3}B^y_{1,3}B^z_{1,3}, ..., B^x_{N_x-1;3}B^y_{1,3}B^z_{1,3}, B^x_{N_x;3}B^y_{1,3}B^z_{1,3} \),
\( B^x_{1;3}B^y_{2,3}B^z_{1,3}, B^x_{2;3}B^y_{2,3}B^z_{1,3}, ..., B^x_{N_x-1;3}B^y_{2,3}B^z_{1,3}, B^x_{N_x;3}B^y_{2,3}B^z_{1,3} \),
\( \cdots \),
\( B^x_{1;3}B^y_{N_y-1,3}B^z_{1,3}, B^x_{2;3}B^y_{N_y-1,3}B^z_{1,3}, ..., B^x_{N_x-1;3}B^y_{N_y-1,3}B^z_{1,3}, B^x_{N_x;3}B^y_{N_y-1,3}B^z_{1,3} \),
\( B^x_{1;3}B^y_{N_y,3}B^z_{1,3}, B^x_{2;3}B^y_{N_y,3}B^z_{1,3}, ..., B^x_{N_x;3}B^y_{N_y,3}B^z_{1,3}, B^x_{N_x;3}B^y_{N_y,3}B^z_{1,3} \),
\( \cdots \),
\( B^x_{1;3}B^y_{1,3}B^z_{2,3}, B^x_{2;3}B^y_{1,3}B^z_{2,3}, ..., B^x_{N_x-1;3}B^y_{1,3}B^z_{2,3}, B^x_{N_x;3}B^y_{1,3}B^z_{2,3} \),
\( B^x_{1;3}B^y_{2,3}B^z_{2,3}, B^x_{2;3}B^y_{2,3}B^z_{2,3}, ..., B^x_{N_x-1;3}B^y_{2,3}B^z_{2,3}, B^x_{N_x;3}B^y_{2,3}B^z_{2,3} \),
\( \cdots \),
\( B^x_{1;3}B^y_{N_y-1,3}B^z_{2,3}, B^x_{2;3}B^y_{N_y-1,3}B^z_{2,3}, ..., B^x_{N_x-1;3}B^y_{N_y-1,3}B^z_{2,3}, B^x_{N_x;3}B^y_{N_y-1,3}B^z_{2,3} \),
\( B^x_{1;3}B^y_{N_y,3}B^z_{2,3}, B^x_{2;3}B^y_{N_y,3}B^z_{2,3}, ...,B^x_{N_x;3}B^y_{N_y,3}B^z_{2,3}, B^x_{N_x;3}B^y_{N_y,3}B^z_{2,3} \),
\( \cdots \),
\( B^x_{1;3}B^y_{1,3}B^z_{N_z,3}, B^x_{2;3}B^y_{1,3}B^z_{N_z,3}, ..., B^x_{N_x-1;3}B^y_{1,3}B^z_{N_z,3},B^x_{N_x;3}B^y_{1,3}B^z_{N_z,3} \),
\( B^x_{1;3}B^y_{2,3}B^z_{N_z,3}, B^x_{2;3}B^y_{2,3}B^z_{N_z,3}, ..., B^x_{N_x-1;3}B^y_{2,3}B^z_{N_z,3}, B^x_{N_x;3}B^y_{2,3}B^z_{N_z,3} \),
\( \cdots \),
\( B^x_{1;3}B^y_{N_y-1,3}B^z_{N_z,3}, B^x_{2;3}B^y_{N_y-1,3}B^z_{N_z,3}, ..., B^x_{N_x-1;3}B^y_{N_y-1,3}B^z_{N_z,3}, B^x_{N_x;3}B^y_{N_y-1,3}B^z_{N_z,3} \),
\( B^x_{1;3}B^y_{N_y,3}B^z_{N_z,3}, B^x_{2;3}B^y_{N_y,3}B^z_{N_z,3}, ..., B^x_{N_x;3}B^y_{N_y,3}B^z_{N_z,3}, B^x_{N_x;3}B^y_{N_y,3}B^z_{N_z,3} \).
W ten sposób uzyskujemy bazę trójwymiarowych funkcji bazowych
\( \{B_{i,j,k;3}(x,y,z)\}_{i=1,...,N_x,j-1,...,N_y,k=1,...,N_z}=\{B^x_{i;3}(x)B^y_{j;3}\}_{i=1,...,N_x,j-1,...,N_y} =\\=\{B^x_{i;3}(x)B^y_{j;3}\}_{i=1,...,19,j-1,...,19}, \{B^x_{i;3}(x)B^z_{j;3}\}_{i=1,...,19,j-1,...,19,k=1,...,19 } \)
rozpiętych na prostopadłościennej siatce obliczeniowej zbudowanej z 16*16*16=4096 elementów.
Możemy rozpiąć na nich aproksymację trójwymiarowej bitmapy
\( u(x,y,z) = \sum_{i=1,j=1,k=1}^{16,16,16} u_{i,j,k} B^x_{i}(x) B^y_{j}(y) B^y_{k}(z) \)
obliczając współczynniki \( u_{i,j,k} \) w sposób opisany w rozdziale pierwszym. W szczególności będziemy musieli wygenerować całki z iloczynów trójek funkcji B-spline
\( \int_{\Omega} {\color{red}B^x_{i}(x) B^y_{j}(y) B^z_{k}(z)} {\color{blue}B^x_{l}(x)B^y_{m}(y)B^z_{n}(z)} dx dy dz \)
dla \( i=1,..,19, j=1,...,19, k=1,...,19 \). W przypadku funkcji bazowych rozpiętych na płaskiej siatce, całki te możemy rozbić na iloczyn trzech całek z trójek B-spline'ów w poszczególnych kierunkach.
\( \int_{\Omega_x} {\color{red}B^x_{i}(x) B^y_{j}(y) B^y_{k}(z)} {\color{blue}B^x_{l}(x)B^y_{m}(y)B^z_{n}(z)} dx dy dz= \int_{\Omega_y} {\color{red}B^x_{i}(x) } {\color{blue}B^x_{l}(x)} dx {\color{red}B^y_{j}(y)} {\color{blue}B^y_{m}(y)} dy {\color{red} B^z_{k}(z)} {\color{blue}B^z_{n}(z)} dz \)
gdzie \( \Omega \) to nasza siatka prostopadłościenna, \( \Omega_x, \Omega_y, \Omega_z \) to osie rozpięte wzdłuż brzegów siatki prostopadłościennej.

Zauważmy, że jeśli chcemy używać innych funkcji bazowych, na przykład bazy równoważnej wielomianom Lagrange'a, cała konstrukcja pozostaje niezmieniona, jedynie definiujemy inne wektory węzłów, które dają nam inną liczbę funkcji bazowych.
Na przykład w celu wygenerowania bazy równoważnej wielomianom Lagrange'a, rozpinamy wektor węzłów
[0 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7 7 8 8 8 9 9 9 10 10 10 11 11 11 12 12 12 13 13 13 14 14 14 15 15 15 16 16 16 16]
wzdłuż osi \( x \) oraz drugi wektor węzłów
[0 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7 7 8 8 8 9 9 9 10 10 10 11 11 11 12 12 12 13 13 13 14 14 14 15 15 15 16 16 16 16]
wzdłuż osi \( y \) i trzeci wektor węzłów
[0 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7 7 8 8 8 9 9 9 10 10 10 11 11 11 12 12 12 13 13 13 14 14 14 15 15 15 16 16 16 16]
wzdłuż osi \( z \).
Następnie generujemy funkcje bazowe zgodnie ze wzorem , i przemnażamy je przez siebie (tworzymy iloczyn tensorowy).
Możemy również na przykład wygenerować wielomiany B-spline trzeciego stopnia
[0 0 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 16 16 16]
wzdłuż osi \( x \), wielomiany równoważne wielomianom Lagrenge'a
[0 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7 7 8 8 8 9 9 9 10 10 10 11 11 11 12 12 12 13 13 13 14 14 14 15 15 15 16 16 16 16]
wzdłuż osi \( y \), oraz wielomiany "hybrydowe"
[0 0 0 0 1 2 3 4 4 4 5 6 7 8 8 8 9 10 11 12 12 12 13 14 15 16 16 16 16]
wzdłuż osi \( z \). Następnie podobnie, generujemy funkcje bazowe zgodnie ze wzorem , i przemnażamy je przez siebie (tworzymy iloczyn tensorowy).
Możliwe jest również konstruowanie siatek, w których mieszane są grupy elementów (po angielsku "patches") różnego rozmiaru i o różnej liczbie elementów i tworzone wektory węzłów dla każdej grupy elementów oddzielnie. Przykład pokazany został na Rys. 2.

Przykładowa trójwymiarowa siatka obliczeniowa uzyskana poprzez scalenie trzech grup elementów ze zdefiniowanymi na nich funkcjami bazowymi B-spline drugiego stopnia. W szczególności na pierwszej największej grupie elementów zdefniowano funkcje bazowe B-spline poprzez zastosowanie wektora węzłów [[0 0 0 1 2 3 4 5 6 7 8 8 8] w kierunku osi x oraz w kierunku osi z, na drugiej środkowej grupie elemetów zdefiniowano wektor węzłóW [[0 0 0 1 2 3 4 4 4] w kierunku osi x i w kierunku osi z, a na trzeciej grupie elementów zdefiniowano wektor węzłów [[0 0 0 1 2 2 2] w kierunku osi x oray y. Ponadto definiujemy wektor węzłów [[0 0 0 1 2 2 3 3 4 4 4] w kierunku osi y.
Rysunek 2: Przykładowa trójwymiarowa siatka obliczeniowa uzyskana poprzez scalenie trzech grup elementów ze zdefiniowanymi na nich funkcjami bazowymi B-spline drugiego stopnia. W szczególności na pierwszej największej grupie elementów zdefniowano funkcje bazowe B-spline poprzez zastosowanie wektora węzłów [0 0 0 1 2 3 4 5 6 7 8 8 8] w kierunku osi x oraz w kierunku osi z, na drugiej środkowej grupie elemetów zdefiniowano wektor węzłóW [0 0 0 1 2 3 4 4 4] w kierunku osi x i w kierunku osi z, a na trzeciej grupie elementów zdefiniowano wektor węzłów [0 0 0 1 2 2 2] w kierunku osi x oray y. Ponadto definiujemy wektor węzłów [0 0 0 1 2 2 3 3 4 4 4] w kierunku osi y.


Ostatnio zmieniona Piątek 26 z Kwiecień, 2024 12:36:03 UTC Autor: Maciej Paszynski
Zaloguj się/Zarejestruj w OPEN AGH e-podręczniki
Czy masz już hasło?

Hasło powinno mieć przynajmniej 8 znaków, litery i cyfry oraz co najmniej jeden znak specjalny.

Przypominanie hasła

Wprowadź swój adres e-mail, abyśmy mogli przesłać Ci informację o nowym haśle.
Dziękujemy za rejestrację!
Na wskazany w rejestracji adres został wysłany e-mail z linkiem aktywacyjnym.
Wprowadzone hasło/login są błędne.